package com.doit.day07

import com.doit.day01.Person

object _02_函数的至简原则 {
  def main(args: Array[String]): Unit = {

    //==》这是哪个算子  ==》 map算子
    def operation(arr: Array[Int], op: Int => Int): Array[Int] = {
      for (elem <- arr) yield op(elem)
    }

    // （2）定义逻辑函数
    val op: Int => Int = (elem:Int)=>{elem*10}

    // （3）标准函数调用
    val arr: Array[Int] = operation(Array(1, 2, 3, 4), op)
    println(arr.mkString(","))//10   20   30  40

    println("=============39期帅哥分隔符==============")

    // （4）采用匿名函数
    val ints: Array[Int] = operation(Array(1, 2, 3, 4), (elem: Int) => {
      elem * 10
    })
    println(ints.mkString(","))//10   20   30  40


    // （4.1）参数的类型可以省略，会根据形参进行自动的推导，类型和小括号就可以省略了
    val arr2 = operation(Array(1, 2, 3, 4), ele => {ele* 10})
    //如果说函数体中{}里面只有一行代码，那么大括号可以省略
    val arr21 = operation(Array(1, 2, 3, 4), ele => ele *10)
    //可不可以用_代替呢？？？如果参数在前面和后面都只用了一次，可以用_代替并且将=》都省略了
    val arr22 = operation(Array(1, 2, 3, 4), _*10)
    println(arr22.mkString(","))//10   20   30  40


    // （4.2）类型省略之后，发现只有一个参数，则圆括号可以省略；其他情
    // 况：没有参数和参数超过 1 的永远不能省略圆括号。


    new PartialFunction[Int,Int] {
      /*
      先过滤掉一部分数据，isDefinedAt 类似于filter的功能
       */
      override def isDefinedAt(x: Int) = x%2 == 0

      /*
      将过滤出来的数据做一个进一步的处理，类似于map操作
       */
      override def apply(v1: Int) = v1*10
    }


  }

}
